home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / raytrace / radiance / simplerd.lha / simplerad / FinalFTP / WalkT / menu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-07-20  |  9.5 KB  |  307 lines

  1. /**********************************************************************/
  2. /*                                                                    */
  3. /* menu.c : menu routines                                             */
  4. /*                                                                    */
  5. /* Copyright (C) 1992, Bernard Kwok                                   */
  6. /* All rights reserved.                                               */
  7. /* Revision 1.0                                                       */
  8. /* May, 1992                                                          *
  9. /**********************************************************************/
  10. #include <stdio.h>
  11. #include <gl/gl.h>
  12. #include <fmclient.h>
  13. #include <string.h>
  14. #define IRIS4D 1
  15. #include "geo.h"
  16. #include "walk.h"
  17. #include "auto.h"
  18.  
  19. char *MFILENAME = "anim.log";
  20.  
  21. extern Matrix viewmat;
  22. extern void DoHelp();
  23. extern void DoExit();
  24. extern void DrawScene();
  25. extern void Save_Screen_Image();
  26. extern void Show_Image();
  27. extern char *meshfilename;
  28.  
  29. /**********************************************************************/
  30. /* Set name of log file for storing movements (not used)              */
  31. /**********************************************************************/
  32. static void SetLogFilename()
  33. {
  34.   char *tmp = "                                                       ";
  35.   
  36.   fprintf(stdout,"Log file name [anim.log]:");
  37.   scanf("%s\n", tmp);
  38.   if (strcmp(tmp,"") == 0) 
  39.     MFILENAME = "anim.log";
  40.   else
  41.     MFILENAME = tmp;
  42. }
  43.  
  44. /**********************************************************************/
  45. /* Read orientations from file. If not currenly logging */
  46. /**********************************************************************/
  47. static void AnimateLog()
  48. {
  49.   if (Option.log == DOLOG) {
  50.     printf("Cannot read movements from file while logging\n");
  51.     printf("Stop logging first !\n");
  52.   } else {
  53.     Option.mode = PREORIENT;
  54.     ClearOrientLog();
  55.     movefilename = MFILENAME;
  56.     moves_logged = ReadMoves(movefilename, &Autoview);
  57.     if (Option.debug) 
  58.       printf("\nRunning %d moves read for orientation...Please wait\n", 
  59.          moves_logged);
  60.     Update_Scene();
  61.     ClearOrientLog();
  62.     Option.log = NOLOG;
  63.   }
  64. }
  65.  
  66.  
  67. /**********************************************************************/
  68. /* Start to log movements, record absolute position */ 
  69. /**********************************************************************/
  70. static void StartLogMode()
  71. {
  72.   AbsMovement *amove;
  73.   AbsMovement tmp;
  74.   Matrix invobjmat;
  75.   Matrix invvwmat;
  76.   Matrix curmat;
  77.  
  78.   /* Find and record absolute position if not already started logging */
  79.   if (Option.log == NOLOG) {
  80.     amove = CreateAbsMove(Viewer);
  81.     getmatrix(curmat);
  82.     if (invert_matrix(objmat,invobjmat) &&
  83.     invert_matrix(viewmat,invvwmat)) {
  84.       pushmatrix(); {
  85.     loadmatrix(invvwmat);
  86.     multmatrix(invobjmat);
  87.     multmatrix(viewmat);
  88.     getmatrix(curmat);
  89.       } popmatrix();
  90.       amove->lookFrom = vtransform(Viewer.lookFrom, curmat);
  91.       amove->lookAt = vtransform(Viewer.lookAt, curmat);
  92.       amove->lookUp = vtransform(Viewer.lookUp, curmat); 
  93.       LogAbsMove(amove, &Autoview, MOVEABS);
  94.     } else {
  95.       fprintf(stderr,"StartLogMode(): non-invertible object matrix !\n");
  96.       exit(1);
  97.     }
  98.   }
  99.   Option.log = DOLOG;
  100. }
  101.  
  102.  
  103. /**********************************************************************/
  104. /* Stop logging movements. */
  105. /**********************************************************************/
  106. static void StopLogMode() 
  107. { Option.log == NOLOG; }
  108.  
  109.  
  110. /**********************************************************************/
  111. /* Only because only 1 arg per menu function */
  112. /**********************************************************************/
  113. void MenuWriteMoves()
  114. {
  115.   movefilename = MFILENAME;
  116.   WriteMoves(movefilename, Autoview, moves_logged);
  117.   Option.log = NOLOG;
  118. }
  119.  
  120.  
  121. /**********************************************************************/
  122. /* Set whether logging or not */
  123. /**********************************************************************/
  124. static void SetDebugMode()
  125. {  Option.debug = !(Option.debug); }
  126.  
  127.  
  128. char image_filename[200];
  129. int img_number = 1;
  130. /**********************************************************************/
  131. /* Store current image in window */
  132. /**********************************************************************/
  133. static void StoreImageRGB()
  134. {
  135.   long xsize, ysize;
  136.  
  137.   /* Store image same size as window size */
  138.   getsize(&xsize, &ysize);
  139.   sprintf(image_filename, "");
  140.   sprintf(image_filename, "%s.%s.%d", meshfilename, "RGB", img_number++);
  141.   printf("\tStoring RGB image to %s. Please wait...\n", image_filename);
  142.   Save_Screen_Image(xsize, ysize, 3, image_filename);
  143.   printf("\tStorage finished\n");
  144. }
  145.  
  146. static void StoreImageGrey()
  147. {
  148.   long xsize, ysize;
  149.  
  150.   /* Store image same size as window size */
  151.   getsize(&xsize, &ysize);
  152.   sprintf(image_filename, "");
  153.   sprintf(image_filename, "%s.%s.%d", meshfilename, "GREY", img_number++);
  154.   printf("\tStoring gray-scale image to %s. Please wait...\n", image_filename);
  155.   Save_Screen_Image(xsize, ysize, 1, image_filename);
  156.   printf("\tStorage finished\n");
  157. }
  158.  
  159. /**********************************************************************/
  160. /* Store current image in window */
  161. /**********************************************************************/
  162. static void DisplayImage()
  163. {
  164.   Show_Image(image_filename);
  165. }
  166.  
  167. /**********************************************************************/
  168. /* Set shade model */
  169. /**********************************************************************/
  170. static void SetShadeModel()
  171.   if (Option.shademodel == FLAT)
  172.     Option.shademodel = GOURAUD;
  173.   else if (Option.shademodel == GOURAUD)
  174.     Option.shademodel = FLAT;
  175.   Draw_Scene();                    /* Redraw scene on change of model */
  176. }
  177.  
  178. /**********************************************************************/
  179. /* Set shading primitive */
  180. /**********************************************************************/
  181. static void SetShadePrim()
  182.   if (Option.shadeprim == SHADE_QUAD) {
  183.     Option.shadeprim = SHADE_TRIA;
  184.   } else if (Option.shadeprim == SHADE_TRIA) {
  185.     Option.shadeprim = NO_SHADE;
  186.   } else if (Option.shadeprim == NO_SHADE) {
  187.     Option.shadeprim = SHADE_QUAD;
  188.     gconfig();
  189.   }
  190.   Draw_Scene();           /* Redraw scene on change of shading mode */
  191. }
  192.  
  193. /**********************************************************************/
  194. /* Set usage of Abuffer (not used) */
  195. /**********************************************************************/
  196. /* static void SetUseAccBuf()
  197.    { 
  198.    printf("** Abuffer option not installed **\n");
  199.    System.UseAccBuf = !System.UseAccBuf; 
  200.    }
  201. */
  202.  
  203. double dscale = 0.1;
  204. /**********************************************************************/
  205. /* Change intensity scale                                             */
  206. /**********************************************************************/
  207. void IncScale() 
  208.   Option.RGBscale += dscale; 
  209.   Draw_Scene();                
  210. }
  211. void DecScale() 
  212.   Option.RGBscale -= dscale; 
  213.   Draw_Scene();                
  214. }
  215.  
  216. /**********************************************************************/
  217. /* Build image menu                                                   */
  218. /**********************************************************************/
  219. static int BuildImageMenu()
  220. {
  221.   static long menu = -1;
  222.  
  223.   if (menu != -1) freepup(menu);
  224.   menu = defpup("Image %t");
  225.  
  226.   addtopup(menu, "Store Colour Image %f", StoreImageRGB);
  227.   addtopup(menu, "Store Grey-Scale Image %f", StoreImageGrey);
  228.   addtopup(menu, "Display Image %f", DisplayImage);
  229.   return menu;
  230. }
  231.  
  232. /**********************************************************************/
  233. /* Build scene menu                                                   */
  234. /**********************************************************************/
  235. static int BuildSceneMenu()
  236. {
  237.   static long menu = -1;
  238.  
  239.   if (menu != -1) freepup(menu);
  240.   menu = defpup("Scene %t");
  241.   
  242.   addtopup(menu, "Store Image %m", BuildImageMenu());
  243.  
  244.   if (Option.shademodel == GOURAUD)
  245.     addtopup(menu, "Flat shade %f", SetShadeModel);
  246.   else if (Option.shademodel == FLAT)
  247.     addtopup(menu, "Gouraud shade %f", SetShadeModel);
  248.  
  249.   if (Option.shadeprim == SHADE_QUAD)
  250.     addtopup(menu, "Triangle patches %f", SetShadePrim);
  251.   else if (Option.shadeprim == SHADE_TRIA)
  252.     addtopup(menu, "Mesh for patches %f", SetShadePrim);
  253.   else if (Option.shadeprim == NO_SHADE)
  254.     addtopup(menu, "Quadrelateral patches %f", SetShadePrim);
  255.   
  256.   addtopup(menu, "Increase scale %f", IncScale);
  257.   addtopup(menu, "Decrease scale %f", DecScale);
  258.  
  259.   return menu;
  260. }
  261.  
  262.  
  263. /**********************************************************************/
  264. /* Build log menu */
  265. /**********************************************************************/
  266. static int BuildLogMenu()
  267. {
  268.   static long menu = -1;
  269.  
  270.   if (menu != -1) freepup(menu);
  271.   menu = defpup("Logs %t");
  272.  
  273.   if (Option.log == DOLOG)
  274.     addtopup(menu, "Stop log %f", StopLogMode);
  275.   else if (Option.log == NOLOG)
  276.     addtopup(menu, "Start log %f", StartLogMode);
  277.   addtopup(menu, "Store log %f", MenuWriteMoves);
  278.   addtopup(menu, "Animate log %f", AnimateLog); 
  279.   /* addtopup(menu, "Set logfilename %f", SetLogFilename);  */
  280.  
  281.   return menu;
  282. }
  283.  
  284. /**********************************************************************/
  285. /* Build main menu */
  286. /**********************************************************************/
  287. void BuildMainMenu()
  288. {
  289.   char str[200];
  290.  
  291.   if (Menu != -1) freepup(Menu);
  292.   sprintf(str,"%s %%t", ProgName);
  293.   Menu = defpup(str);
  294.  
  295.   addtopup(Menu, "Help %f", DoHelp);
  296.   if (Option.debug == NODEBUG)
  297.     addtopup(Menu, "Debug %f", SetDebugMode);
  298.   else if (Option.debug == DEBUG)
  299.     addtopup(Menu, "No debug %f", SetDebugMode);
  300.   addtopup(Menu, "Scene %m", BuildSceneMenu());
  301.   addtopup(Menu, "Logs %m", BuildLogMenu());
  302. }
  303.